/**
 * Axios请求封装 + 拦截器
 * 作者：资深Flask讲师
 * 功能：
 *   1. 请求拦截器：自动在请求头添加token
 *   2. 响应拦截器：统一处理错误，自动刷新token
 */

import axios from 'axios'
import { useRouter } from 'vue-router'

// 创建axios实例
const request = axios.create({
  baseURL: 'http://localhost:5000/api',  // 后端API基础地址
  timeout: 10000,  // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器：在发送请求前自动添加token
request.interceptors.request.use(
  (config) => {
    // 从localStorage获取access_token
    const accessToken = localStorage.getItem('access_token')
    
    // 如果存在token，则在请求头中添加
    if (accessToken) {
      config.headers['Authorization'] = `Bearer ${accessToken}`
    }
    
    console.log('📤 发送请求:', config.method.toUpperCase(), config.url)
    
    return config
  },
  (error) => {
    console.error('❌ 请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器：统一处理响应和错误
request.interceptors.response.use(
  (response) => {
    // 请求成功，直接返回数据
    console.log('✅ 响应成功:', response.config.url, response.data)
    return response
  },
  async (error) => {
    console.error('❌ 响应错误:', error)
    
    const originalRequest = error.config
    
    // 如果是401错误（token过期或无效）
    if (error.response && error.response.status === 401) {
      console.log('🔄 Token可能已过期，尝试刷新...')
      
      // 避免无限循环刷新
      if (originalRequest._retry) {
        console.log('⚠️ Token刷新失败，跳转登录页')
        // 清除本地存储
        localStorage.removeItem('access_token')
        localStorage.removeItem('refresh_token')
        localStorage.removeItem('username')
        
        // 跳转到登录页
        if (typeof window !== 'undefined') {
          window.location.href = '/'
        }
        return Promise.reject(error)
      }
      
      originalRequest._retry = true
      
      // 尝试使用refresh_token刷新access_token
      const refreshToken = localStorage.getItem('refresh_token')
      
      if (refreshToken) {
        try {
          // 调用刷新token接口
          const response = await axios.post('http://localhost:5000/api/user/refresh_token', {
            refresh_token: refreshToken
          })
          
          if (response.data.code === 200) {
            // 更新access_token
            const newAccessToken = response.data.data.access_token
            localStorage.setItem('access_token', newAccessToken)
            
            console.log('✅ Token刷新成功，重新发送请求')
            
            // 更新原请求的Authorization头
            originalRequest.headers['Authorization'] = `Bearer ${newAccessToken}`
            
            // 重新发送原请求
            return request(originalRequest)
          }
        } catch (refreshError) {
          console.error('❌ 刷新Token失败:', refreshError)
          
          // 刷新失败，清除本地存储并跳转登录页
          localStorage.removeItem('access_token')
          localStorage.removeItem('refresh_token')
          localStorage.removeItem('username')
          
          if (typeof window !== 'undefined') {
            window.location.href = '/'
          }
        }
      } else {
        console.log('⚠️ 未找到refresh_token，跳转登录页')
        
        // 没有refresh_token，跳转登录页
        if (typeof window !== 'undefined') {
          window.location.href = '/'
        }
      }
    }
    
    return Promise.reject(error)
  }
)

export default request


